package com.zlj.jdbc.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *  编写BaseServlet，获取method名，然后通过反射调用方法，得到结果，对结果进行处理，判断是转发还是重定向
 */
public abstract class BaseServlet extends HttpServlet{
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取参数，用来获取用户想请求的方法
	    String methodName = request.getParameter("method");
	    if(methodName == null || methodName.isEmpty()) {
	    	throw new RuntimeException("您没有传递method参数，无法确定您要调用的方法！" );
	    }
	    
	    //得到方法名称，通过反射来调用方法！
	    //得到当前类的class对象
	    Class c = this.getClass();
	    Method method = null;
	    try {
			method = c.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
		} catch (NoSuchMethodException | SecurityException e) {
			throw new RuntimeException("此方法名" + methodName + "(HttpServletRequest,HttpServletResponse)不存在！" );
		} 
	    
	    //调用method表示的方法
	    try {
	    	/*
	    	 * 正常调用是：this.addUser(request,response);
	    	 * 通过反射调用方法是：method.invoke(this,request,response);
	    	 */
			String result = (String)method.invoke(this, request,response);
			/*
			 * 获取请求处理方法执行后返回的字符串，它表示转发或者重定向的路径！
			 * 然后完成转发或者重定向！
			 * 
			 * 如果用户返回的字符串是null或者是""，那么什么也不做！
			 * 
			 * 查看返回的字符串中的是否包含冒号 ，如果没有，表示转发
			 * 如果有，使用冒号分隔字符串，得到前缀和后缀
			 * 其中，前缀如果是f，表示转发，如果是r，表示重定向，后缀是要转发或者重定向的路径！
			 */
			if(result == null || result.isEmpty()) {
				return;
			}
			
			if(result.contains(":")) {
				int index = result.indexOf(":");  //获取冒号的位置
				String first = result.substring(0, index);
				String path = result.substring(index + 1);
				if(first.equalsIgnoreCase("r")) {
                    response.sendRedirect(request.getContextPath() + path);					
				} else if(first.equalsIgnoreCase("f")) {
					request.getRequestDispatcher(path).forward(request, response);
				} else{
					throw new RuntimeException("您给的操作：" + first + ",当前版本不支持！");
				}
			} else {  //没有冒号，默认为转发
				request.getRequestDispatcher(result).forward(request, response);
			}
		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			System.out.println("您调用的方法内部出现了问题！");
			throw new RuntimeException(e);
		}
	}
}
